package com.ruihang.generalibrary.utils;

import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;

import java.util.Set;

/**
 * SharedPreferences的一个工具类，调用setParam就能保存String, Integer, Boolean, Float,
 * Long类型的参数,同样调用getParam就能获取到保存在手机里面的数据
 *
 * @author ZengCS
 * @since 2014年10月15日
 *
 */
public class SharedPreferencesUtil {
    /** 保存在手机里面的文件名 */
    private static final String FILE_NAME = "PandaWoTV3_CONFIG_V2";

    public static final class FontSize {
        /** 超小 */
        public static final float MIN = 1.0f;
        /** 小 */
        public static final float SMALL = 2.0f;
        /** 标准 */
        public static final float STAND = 3.0f;
        /** 大 */
        public static final float BIG = 4.0f;
        /** 超大 */
        public static final float MAX = 5.0f;
    }

    public static final class Common {
        /** 栏目列表 */
        public static final String CATEGORY_LIST = "CATEGORY_LIST";
        /** 我的栏目列表 */
        public static final String MY_CATEGORY_LIST = "MY_CATEGORY_LIST";
        /** 启动图片地址 */
        public static final String SPLASH_IMAGE_URL = "SPLASH_IMAGE_URL";
    }

    /**
     * 用户相关
     *
     * @author ZengCS
     * @since 2015年1月6日14:07:58
     */
    public static final class Account {
        /** 保存用户是否已登录标识符 */
        public static final String IS_LOGIN = "IS_LOGIN";
        /** 保存用户登录信息JSON字符串 */
        public static final String ACCOUNT_INFO = "ACCOUNT_INFO";
        /** 用户登录名,用于下次登录自动填充 */
        public static final String ACCOUNT_USERNAME_CACHE = "ACCOUNT_USERNAME_CACHE";
    }

    /**
     * 系统设置相关
     *
     * @author ZengCS
     * @since 2015年1月6日14:07:04
     */
    public static final class Setting {
        /**
         * 移动网络下播放
         */
        public static final String MOBILE_PLAY_ABLE = "MOBILE_PLAY_ABLE";
        /**
         * 消息免打扰
         */
        public static final String DISABLE_PUSH_MSG = "DISABLE_PUSH_MSG";
        public static final String WATCH_LISTENER_ABLE = "WATCH_LISTENER_ABLE";
        public static final String STUDY_TASK_LISTENER_ABLE = "STUDY_TASK_LISTENER_ABLE";
        public static final String VIDEO_CACHE_DIR = "VIDEO_CACHE_DIR";
    }

    /**
     * 引导相关
     */
    public interface Guide{
        String guidedHomeVersion="guided_version_home";
        String guidedMineVersion="guided_version_mine";
    }

    /**
     * 预约相关
     */
    public static interface Appointment{
        String Appointment_Livint="appointment_living";
    }

    /**
     * 保存数据的方法，我们需要拿到保存数据的具体类型，然后根据类型调用不同的保存方法
     *
     * @param context
     * @param key
     * @param object
     */
    public static void setParam(Context context, String key, Object object) {
        String type = object.getClass().getSimpleName();
        SharedPreferences sp = getSharedPreferenceInstance(context);
        SharedPreferences.Editor editor = sp.edit();

        if ("String".equals(type)) {
            editor.putString(key, (String) object);
        } else if ("Integer".equals(type)) {
            editor.putInt(key, (Integer) object);
        } else if ("Boolean".equals(type)) {
            editor.putBoolean(key, (Boolean) object);
        } else if ("Float".equals(type)) {
            editor.putFloat(key, (Float) object);
        } else if ("Long".equals(type)) {
            editor.putLong(key, (Long) object);
        }

        editor.commit();
    }

    /**
     * 保存数据的方法，我们需要拿到保存数据的具体类型，然后根据类型调用不同的保存方法
     *
     * @param context
     * @param key
     * @param object
     */
    public static <T> void setParams(Context context, String key, T object) {
        if(TextUtils.isEmpty(key)){
            return;
        }
        String type = object.getClass().getSimpleName();
        SharedPreferences sp = getSharedPreferenceInstance(context);
        SharedPreferences.Editor editor = sp.edit();

        if(object==null){
            editor.remove(key);
        }else{
            if(object instanceof String){
                editor.putString(key, (String) object);
            }else if(object instanceof Integer){
                editor.putInt(key, (Integer) object);
            }else if(object instanceof Boolean){
                editor.putBoolean(key, (Boolean) object);
            }else if(object instanceof Float){
                editor.putFloat(key, (Float) object);
            }else if(object instanceof Long){
                editor.putLong(key, (Long) object);
            }else if(object instanceof Set){
                Set<?> s= (Set<?>) object;
                if(s.size()>0 ) {
                    editor.putStringSet(key, (Set<String>) object);
                }
            }
        }

//        if ("String".equals(type)) {
//            editor.putString(key, (String) object);
//        } else if ("Integer".equals(type)) {
//            editor.putInt(key, (Integer) object);
//        } else if ("Boolean".equals(type)) {
//            editor.putBoolean(key, (Boolean) object);
//        } else if ("Float".equals(type)) {
//            editor.putFloat(key, (Float) object);
//        } else if ("Long".equals(type)) {
//            editor.putLong(key, (Long) object);
//        }

        editor.commit();
    }

    public static SharedPreferences.Editor getNewEditor(Context context){
//        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        return getSharedPreferenceInstance(context).edit();
    }

    /**
     * 得到保存数据的方法，我们根据默认值得到保存的数据的具体类型，然后调用相对于的方法获取值
     *
     * @param context
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object getParam(Context context, String key, Object defaultObject) {
        String type = defaultObject.getClass().getSimpleName();
        SharedPreferences sp = getSharedPreferenceInstance(context);

        if ("String".equals(type)) {
            return sp.getString(key, (String) defaultObject);
        } else if ("Integer".equals(type)) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if ("Boolean".equals(type)) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if ("Float".equals(type)) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if ("Long".equals(type)) {
            return sp.getLong(key, (Long) defaultObject);
        }
        return null;
    }

    public static SharedPreferences getSharedPreferenceInstance(Context context){
        return context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
    }
}